package com.example.dynamicproxy2;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @version 1.0.0
 * @className: CatSystemProxy
 * @description:
 * @author: zhangjunfa
 * @date: 2022/6/22 15:56
 */
public class CatSystemProxy implements InvocationHandler {
    //创建的是谁的代理对象，就把谁传递进来
    Object obj;

    //有参数构造传递
    public CatSystemProxy(Object target) {
        this.obj = target;
    }

    /**
     * 获得代理对象
     * public static Object newProxyInstance(ClassLoader loader,
     * Class<?>[] interfaces,
     * InvocationHandler h)
     * (类加载器)ClassLoader loader,
     * （接口数组） Class<?>[] interfaces,
     * （接口）传入接口的实现类  InvocationHandler h
     */
    public Object getProxy() {
        return Proxy.newProxyInstance(this.getClass().getClassLoader(), obj.getClass().getInterfaces(), this::invoke);
    }

    //增强的逻辑
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //调用原本的方法，并接收返回值
        Object result = method.invoke(obj, args);
        //返回新方法的返回值
        return result;
    }
}
